public class ZuoXuanWordOfString {
    /*
    * 左旋转字符串
    * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
    * 请定义一个函数实现字符串左旋转操作的功能。
    * 比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
    * */
    public static void main(String[] args){
        ZuoXuanWordOfString zuoXuanWordOfString = new ZuoXuanWordOfString();
        System.out.println(zuoXuanWordOfString.mySolution("abcdefg", 2));
        char[] chars = new char[5];
    }

    // 我的想法：按照新字符串的顺序，逐个写入builder
    public String mySolution(String s, int n){
        StringBuilder builder = new StringBuilder(s.length());
        for (int i = n; i < s.length(); i++) {
            builder.append(s.charAt(i));
        }
        for (int i = 0; i < n; i++) {
            builder.append(s.charAt(i));
        }
        return builder.toString();
    }

    // 局部反转+整体反转
    // 具体步骤为：
    // 1. 反转区间为前n的子串
    // 2. 反转区间为n到末尾的子串
    // 3. 反转整个字符串
    public String solution(String s, int n){
        char[] chars = s.toCharArray();
        reverse(chars, 0, n-1);
        reverse(chars, n, chars.length-1);
        reverse(chars, 0, chars.length-1);
        return new String(chars);
    }

    public void reverse(char[] chars, int start, int end){
        while (start < end){
            chars[start] ^= chars[end];
            chars[end] ^= chars[start];
            chars[start] ^= chars[end];
            start++;
            end--;
        }
    }

    // 这个方法反而显示的是效果最好的。。。。。。但申请的空间毫无疑问更大
    public String solution1(String s, int n){
        return s.substring(n) + s.substring(0,n);
    }
}
